package com.chen.function_demo.chapter2;

import java.util.Comparator;
import java.util.concurrent.Callable;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * 第二章第二节
 * @author 陈哲<p>
 * ================================<p>
 * Date: 2025/5/11<p>
 * Time: 18:11<p>
 * ================================
 */
public class Section2 {
    /*
        前面学会了如何自己创建函数式接口，但在实际工作和使用中更情况使用的是JDK定义的函数式接口
        JDK中常见的函数式接口：
        1、Runnable：() -> void (无参 无返回结果) 用于多线程场景；
        2、Callable<V>：() -> V (无参 有返回结果) 用于多线程场景，代表的是有返回结果的任务。
        3、Comparator<T>：(T o1, T o2) -> int (两个入参，两个入参为同一类型 返回值int类型) 用于排序场景；
        4、Consumer<T>：(T t) -> void（一个入参 无返回结果） 代表的是一个消费型接口，即有入参，无返回值。
        根据第4个延伸出来的如：BiConsumer<T,U>：(T t, U u) -> void（两个入参 无返回结果） IntConsumer 入参是int LongConsumer 参数是long等
        5、Function<T,R>：(T t) -> R（一个入参 有返回值） 代表的是一个函数型接口，即有入参，有返回值。
        根据第5个延伸出来的如：BiFunction<T, U, R> (T t, U u) -> R；IntFunction<R> (int) -> R 入参是int；LongFunction<R>等。
        6、Predicate<T>：(T t) -> boolean（入参 返回值boolean） 代表的是一个断言型（判断）接口，即有入参，有返回值boolean
        根据第6个延伸出来的如：BiPredicate<T, U> (T t, U u) -> boolean；IntPredicate (int) -> boolean 入参是int LongPredicate等
        7、Supplier<T>：() -> T（无参 有返回值） 代表的是一个生产型接口，即无入参，有返回值。
        根据第7个延伸出来的如：IntSupplier () -> int；LongSupplier () -> long；DoubleSupplier () -> double等 这个不同的是int这种指定的是返回结果
        8、UnaryOperator<T>：(T t) -> T（入参 返回值和入参一致） 代表的是一个一元操作型接口，即有一个入参，返回值和入参类型一致 Operator就是入参和返回结果一致。
        根据第8个延伸出来的如：BinaryOperator<T> (T t1, T t2) -> T 代表的是一个二元操作型接口，即有两个入参，返回值和入参类型一致；IntUnaryOperator<T> (int) -> int等
        最基础的四个函数式接口：
        Supplier（无参 有返回结果）生产型接口
        Consumer（一个入参 无返回结果）消费型接口
        Function（一个入参 有返回结果）函数型接口
        Predicate（入参 返回值boolean）断言型接口
        Bi的就是双参
     */
    public static void main(String[] args) {
        // Runnable
        Runnable runnable = () -> System.out.println("hello");
        // Callable
        Callable<String> callable = () -> "hello";
        // Comparator
        Comparator<Integer> comparator = Integer::compareTo;
        // Consumer
        Consumer<String> consumer = System.out::println;
        // Function
        Function<Integer, String> function = String::valueOf;
        // Predicate
        Predicate<Integer> predicate = a -> a > 0;
    }

}
